ASP.NET Source Code Viewer Font Size:
Imports System
Imports System.Web.UI
<ParseChildren(True)> Public Class TemplatedHelloWorldVB
    Inherits Control
    Implements INamingContainer

    Private _messageTemplate As ITemplate
    Private _toPerson As String = Nothing
    Private _fromPerson As String = Nothing
    Private _message As String = Nothing
    Private myTemplateContainer As Control

    Protected Overrides Sub OnDataBinding(ByVal e As EventArgs)
        EnsureChildControls()
    End Sub

    <TemplateContainer(GetType(MessageTemplateContainerVB))> Public Property MessageTemplate() As ITemplate
        Get
            Return _messageTemplate
        End Get
        Set(ByVal Value As ITemplate)
            _messageTemplate = Value
        End Set
    End Property

    Public Property ToPerson() As String
        Get
            Return _toPerson
        End Get
        Set(ByVal Value As String)
            _toPerson = Value
        End Set
    End Property

    Public Property FromPerson() As String
        Get
            Return _fromPerson
        End Get
        Set(ByVal Value As String)
            _fromPerson = Value
        End Set
    End Property

    Public Property Message() As String
        Get
            Return _message
        End Get
        Set(ByVal Value As String)
            _message = Value
        End Set
    End Property

    Protected Overrides Sub CreateChildControls()
        If Not MessageTemplate Is Nothing Then
            ' Use user-defined template for rendering
            myTemplateContainer = New MessageTemplateContainerVB(Me)
            MessageTemplate.InstantiateIn(myTemplateContainer)
            Controls.Add(myTemplateContainer)
        Else
            ' Use the default rendering
            Controls.Add(New LiteralControl("<b>To:</b> " & ToPerson & "<br/>"))
            Controls.Add(New LiteralControl("<b>From:</b> " & FromPerson & "<br/>"))
            Controls.Add(New LiteralControl("<b>Message:</b><p>" & Message & "</p>"))
        End If
    End Sub
End Class

' Keeps a backpointer to the parent control to access its properties
Public Class MessageTemplateContainerVB
    Inherits Control
    Implements INamingContainer

    Private _parent As TemplatedHelloWorldVB

    Public Sub New(ByVal parent As TemplatedHelloWorldVB)
        _parent = parent
    End Sub

    Public ReadOnly Property ToPerson() As String
        Get
            Return _parent.ToPerson
        End Get
    End Property

    Public ReadOnly Property FromPerson() As String
        Get
            Return _parent.FromPerson
        End Get
    End Property

    Public ReadOnly Property Message() As String
        Get
            Return _parent.Message
        End Get
    End Property
End Class